#include"main_server.h"

// 如果有数据过来进入report_queue队列，则读取数据
void new_report_request(event_loop *loop, int fd, void *args){
    
    // 得到client
    tcp_client* client = (tcp_client*)args;

    // 1.将数据从report_queue队列中取出
    std::queue<lars::ReportStatusRequest> queue;

    // 2.将取出的数据放在一个queue队列中
    report_queue->recv(queue);

    // 3.遍历容器中的元素，以此将每个元素消息发送给report_service
    while(!queue.empty()){
        // 获取其中的每一个消息元素
        lars::ReportStatusRequest msg = queue.front();
        queue.pop();

        // 将消息转换成字符串
        std::string requestString;
        msg.SerializeToString(&requestString);

        // 尝试将消息请求发给report service
        client->send_message(requestString.c_str(), requestString.size(), lars::ID_ReportStatusRequest);
    }
}

// 启动report客户端的回调函数
void* report_client_thread(void* args){
    printf("report client thread start\n");

    event_loop loop;
   
    // 设定一个tcp客户端与服务器连接
    tcp_client client(&loop, config.reporter_ip.c_str(), config.reporter_port);

    // 设定一个loop监控queue中的数据
    report_queue->set_loop(&loop);

    // 设置读函数
    report_queue->set_callback(new_report_request, &client);

    loop.event_process();

    return NULL;
}

// 启动report客户端的函数
void start_report_client(void *args){
    
    // 开辟一个新线程
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, report_client_thread, NULL);
    if(ret == -1){
        fprintf(stderr, "new thread report error\n");
        exit(1);
    }

    pthread_detach(tid);


}